package sliceutil

// RemoveString remove string from slice if function return true.
func RemoveString(slice []string, remove func(item string) bool) []string {
	for i := 0; i < len(slice); i++ {
		if remove(slice[i]) {
			slice = append(slice[:i], slice[i+1:]...)
			i--
		}
	}
	return slice
}

// FindString return true if target in slice, return false if not.
func FindString(slice []string, target string) bool {
	for _, str := range slice {
		if str == target {
			return true
		}
	}
	return false
}

// FindInt return true if target in slice, return false if not.
func FindInt(slice []int, target int) bool {
	for _, str := range slice {
		if str == target {
			return true
		}
	}
	return false
}

// FindUint return true if target in slice, return false if not.
func FindUint(slice []uint, target uint) bool {
	for _, str := range slice {
		if str == target {
			return true
		}
	}
	return false
}

// HasNotIn [T int | string | int32 | int64]
//
//	@Description: 判断一个值是否在一个列表中
//	@param value ：需要判断的值
//	@param allows ： 容许的值列表
//	@return bool ：返回值，true代表有不存在于列表中的值
func HasNotIn[T int | string | int32 | int64](value T, allows []T) bool {
	return !HasIn(value, allows)
}

// HasIn [T int | string | int32 | int64]
//
//	@Description: 判断一个值是否在列表中
//	@param value ：需要判断的值
//	@param allows ： 容许的值列表
//	@return bool：返回true代表在列表中
func HasIn[T int | string | int32 | int64](value T, allows []T) bool {
	if len(allows) == 0 {
		return false
	}
	for _, allow := range allows {
		if value == allow {
			return true
		}
	}
	return false
}

func DeleteSlice[T int | string | int32 | int64](s []T, elem T) []T {
	if len(s) == 0 {
		return s
	}
	j := 0
	for i := 0; i < len(s); i++ {
		if s[i] != elem {
			s[j] = s[i]
			j++
		}
	}
	return s[:j]
}
